setTimeout(() => {
  console.log('setTimout');
}, 0);

setImmediate/** ←node特有的,也是宏任务,预定在 I/O 事件的回调之后立即执行的 callback。*/(() => {
  console.log('setImmediate');
}/*,第二个参数开始是会传入你指定的回调的参数*/);

/** 他俩 谁先执行不一定*/

//↑主栈清空后 会先去清空微任务队列
//这里没有微任务

/** why this happen?*/
// https://nodejs.org/dist/latest-v13.x/docs/api/timers.html#timers_settimeout_callback_delay_args
//> When delay is larger than 2147483647(2的23次方-1) or less than 1, the delay will be set to 1. Non-integer delays are truncated to an integer.
// 也就是说node里即时定时器设置为setTimeout(()=>{},0),它其实等于setTimeout(()=>{},1)
// 所以如果事件环执行到定时器阶段的时,还没有到1ms,那么就会往下走到setImmediate,setImmediate并不是一个定时器,它是"立即执行"的一个回调(在IO阶段之后)
// 故如果你机器此时运行慢 就会先执行setTimeout 如果运行快 就会先执行setImmediate,而运行情况因为是波动的,故这里打印谁是不一定的

//你可以从02setTimeout和setImmediate这个例子得到论证
